package com.qianfeng.day11.service;

import com.qianfeng.day11.util.Snowflake;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class KillService {
    @Resource
    private RedisTemplate template;

    // 使用watch来实现抢优惠券功能
//    public String kill(){
//        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        try {
//            Date date = df.parse("2019-11-25 11:15:00");
//            Date now = new Date();
//            if(now.getTime() < date.getTime()){
//                return null;
//            }
//        }catch (Exception ex){
//            ex.printStackTrace();
//            return null;
//        }
//        ValueOperations operations = template.opsForValue();
//        List<Object> list = null;
//                // 监视num数据
//        template.watch("num");
//        // 获取当前优惠券已经被抢出的数量
//        int n = (Integer) operations.get("num");
//        if (n < 10){
//            try {
//                Thread.sleep(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            template.multi();
//            operations.increment("num", 1);
//            list = template.exec();
//        }
//
//        if (list == null || list.size() == 0){
//            return null;
//        }else{
//            // 生成的订单号
//            String name = String.valueOf(Snowflake.getInstance().nextId());
//            // 省略订单保存数据库操作。。。
//
//            return name;
//        }
//
//    }

    // 使用setnx实现抢优惠券功能
    public String kill(){
//        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        try {
//            Date date = df.parse("2019-11-25 11:15:00");
//            Date now = new Date();
//            if(now.getTime() < date.getTime()){
//                return null;
//            }
//        }catch (Exception ex){
//            ex.printStackTrace();
//            return null;
//        }
        ValueOperations operations = template.opsForValue();

        // 抢先生成token，谁先抢到，谁获得锁
        Boolean success = operations.setIfAbsent("token", "1");
        if (success){
            // 获取当前优惠券已经被抢出的数量
            int n = (Integer) operations.get("num");
            if (n < 10){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                operations.increment("num", 1);
                // 生成的订单号
                String name = String.valueOf(Snowflake.getInstance().nextId());
                // 省略订单保存数据库操作。。。

                // 删除抢先生成的token
                template.delete("token");
                return name;
            }else {
                return null;
            }
        }else{
            return null;
        }
    }
}
